package main

import (
	"bufio"
	"fmt"
	"io"
	"io/ioutil"
	"os"
)

//读文件操作
/*
	读数据:
		reader接口
			Read(p []byte)(n int,error)
*/
//读文件有三种操作方法： for循环、bufio、ioutio
//func main() {
//	fileObj,err:=os.Open("./common.go")
//	if err != nil {
//		fmt.Printf("open file failed,err:%v", err)
//		return
//	}
//	// 记得关闭文件
//	defer fileObj.Close()
//	// 1.采用for循环读文件 （自己设定读多少字节）
//	var tmp =make([]byte,128) //指定读的长度
//	for{
//		n,err:=fileObj.Read(tmp[:])
//		if err ==io.EOF {
//			fmt.Println("文件读完了")
//			return
//		}
//		if err != nil {
//			fmt.Printf("read error: %v\n", err)
//			return
//		}
//		fmt.Printf("读了%d个字节\n",n)
//		fmt.Println(string(tmp[:n]))
//		if n<128 {
//			return
//		}
//	}
//}
//  2.利用bufio这个包读取文件(一行一行的读)
func readFromFilebyBufio() {
	fileObj, err := os.Open("./common.go")
	if err != nil {
		fmt.Printf("Error opening file: %v\n", err)
		return
	}
	// 记得关闭文件
	defer fileObj.Close()
	// 创建一个用来存文件中读内容的对象
	reader := bufio.NewReader(fileObj)
	for {
		line, err := reader.ReadString('\n')
		if err == io.EOF {
			return
		}
		if err != nil {
			fmt.Printf("read file failed,err:%v ", err)
			return
		}
		fmt.Println(line)
	}
}

//  3.采用Ioutil读取整个文件
func readFromFilebyIoutil() {
	ret, err := ioutil.ReadFile("./common.go")
	if err != nil {
		fmt.Printf("read file failed,err:%v", err)
		return
	}
	fmt.Println(string(ret))
}
func main() {
	/*
		流程:
			1.打开文件
			2.读取数据
			3.关闭文件
	*/
	/*	测试读文件写法
		if file, err := os.OpenFile("./1.txt", os.O_RDWR, os.ModePerm); err != nil {
			fmt.Println("打开文件失败", err)
			return
		} else {
			b := make([]byte, 4, 4)
			n, err := file.Read(b)
			if err != nil {
				fmt.Printf("读文件失败 %s\n", err)
			}
			fmt.Println(n) //长度
			fmt.Println(b) //打印数据
			file.Close()
		}
	*/
	readFromFilebyBufio()
	readFromFilebyIoutil()
}
